package day05.concurrent02;

import java.util.concurrent.*;

public class Demo07 {
    public static void main(String[] args) throws Exception {
        //1.创建线程池
        ThreadPoolExecutor pool = new ThreadPoolExecutor(
                3,
                5,
                5,
                TimeUnit.SECONDS,
                new ArrayBlockingQueue(2)
        );

        //2.提交任务 execute(Runnable) - 返回值void
//        pool.execute(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("任务1");
//            }
//        });

        //3.提交任务 submit(Runnable) - 返回值Future
//        Future<?> future = pool.submit(new Runnable() {
//            @Override
//            public void run() {
//                System.out.println("任务2开始");
//                try {
//                    Thread.sleep(2000);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                System.out.println("任务2结束");
//            }
//        });
//        future.get();//get方法会阻塞，直到任务结束
//        System.out.println("主线程发现:任务2已结束");

        //4.提交任务 submit(Callable) - 返回值Future
        Future<String> future = pool.submit(new Callable<String>() {
            @Override
            public String call() throws Exception {
                System.out.println("任务2开始");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("任务2结束");
                return "result from call!!!";
            }
        });

        String result = future.get();//get方法会阻塞，直到任务结束,并且会得到call()执行后的返回值
        System.out.println("主线程发现:任务2已结束，返回值为"+result);

        //5.invokeAny() - 参看资料
        //6.invokeAll() - 参看资料

    }
}
